﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2009-10-19
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


//----------------------------------------------------------------
// 单行编辑框的编辑逻辑（自定义单行编辑控件可以重载）
//----------------------------------------------------------------
class FUI_Edit;
class FAPI FU_ET_SINGLE : public FU_EDIT_DATA
{
    FUI_DECLARE_CLASS(FU_ET_SINGLE);

public:
    FUI_Edit* pEdit;
    size_t drawStart;       // 当前字符显示的偏移位置
    size_t drawStartPixel;  // 渲染偏移的象素位置（横向）
    FV_UI_PEDIT_CHAR freeLst;// 空闲的字符表

    FU_ET_SINGLE();
    virtual~FU_ET_SINGLE();
    virtual void GetChar(FUI_INIT* uit, const WCHAR* ch, size_t& w, size_t& h);
    virtual void Clear();
    virtual bool Set(size_t p, bool shift);
    virtual funit Offset(){ return (funit)drawStartPixel; }
    virtual size_t StartOffset(){ return drawStart; }
    virtual FU_EDIT_CHAR* AllocChar();
    virtual void FreeChar(FU_EDIT_CHAR* p){ freeLst.push_back(p); }
    virtual void GetRect(fuRect& rc);
};


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class FAPI FUI_Edit : public FUI_Object
{
    FUI_DECLARE_CLASS(FUI_Edit)

    friend class FUI_Combo;

public:
    FUI_Edit(EF_UI_WIDGET_TYPE t = eUWT_Edit);
    virtual~FUI_Edit();
    virtual void Release();
    virtual void Render(EF_UI_RENDER_LAYER layer);
    virtual bool CanGetFocus(){ return !IsReadOnly() && FUI_Object::CanGetFocus(); }
    virtual void SetText(const WCHAR* szText);
    virtual void SetText(const ACHAR* szText);
    virtual const WCHAR* GetText(){ return editDT->szText.c_str(); }
    virtual const WCHAR* GetSelectText(){ return editDT->szSelect.c_str(); }
    virtual bool HasClip(){ return editDT->CharCount() > 0; }
    virtual bool OnMouseMove(funit nX, funit nY);
    virtual bool OnLButtonDown(funit nX, funit nY);
    virtual bool OnLButtonUp(funit nX, funit nY);
    virtual bool OnLButtonDBClick(funit nX, funit nY);
    virtual bool OnChar(unsigned int nChar);
    virtual bool OnKeyDown(unsigned int nChar);

    // 清空
    virtual void Clear(){ editDT->Clear(); }
    // 复制
    virtual bool Copy();
    // 剪切
    virtual bool Cut();
    // 粘贴
    virtual bool Paste();
    // 全选
    virtual void SelectAll();
    // 清除选择
    virtual void CancelSelect(){ editDT->CancelSel(); }
    // 创建和消毁编辑逻辑（扩展时使用）
    virtual void _CreateDestoryEdit(bool create);

    // 设置是否只读
    FINLINE void SetReadOnly(bool b){ pEditData->SetReadOnly(b); }
    // 是否是只读的
    FINLINE bool IsReadOnly(){ return pEditData->IsReadOnly(); }
    // 设置是否数字模式
    FINLINE void SetNumber(bool b){ pEditData->SetNumber(b); }
    // 是否是数字模式
    FINLINE bool IsNumber(){ return pEditData->IsNumber(); }
    // 最大允许输入长度
    FINLINE void SetMaxLength(const WORD n){ pEditData->nTextMaxLength = n; }

protected:
    virtual void InitUIData(FUI_Object* father, fuWidgetBase* pData, FUI_Layout* layout);

protected:
    fuWidgetEdit* pEditData;// 控件数据地址
    bool bLButtonDown;      // 鼠标是否按下
    DWORD dwRayStart;       // 闪烁的开始时间
    NCHAR szAppendChar[3];  // 等待加入串的字符 szAppendChar[2]永远保持为0
    FU_ET_SINGLE* editDT;   // 单行编辑逻辑
};